import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;

public class Test {
    //写法一
    public int removeDuplicates1(int[] nums) {
        if(nums==null||nums.length==0)return 0;
        //原本用HashSet可以直接去重，但顺序不保证，这里也可以用LInkedHashSet就可以保证顺序了
        Set<Integer> hash=new LinkedHashSet<>();
        //放到哈希表里面去进行去重
        for(int x:nums){
            hash.add(x);
        }
        //遍历哈哈希表
        int i=0;
        for(int num:hash){
            nums[i++]=num;
        }
        return hash.size();
    }

    //写法二
    public int removeDuplicates2(int[] nums){
        int slow=0,fast=1;
        while (fast<nums.length){
            //如果相等就快指针一直往后面走，直到不相等的时候使用快指针的值赋值给慢指针+1的位置，此时慢指针走一步
            if(nums[slow]!=nums[fast]){
                nums[slow+1]=nums[fast];
                slow++;
            }else {
                fast++;
            }
        }
        //因为返回的是长度，需要slow+1
        return slow+1;
    }
    public static void main(String[] args) {
        int[] nums={0,0,1,1,1,2,2,3,3,4};
        Test test=new Test();
        //若不进行拷贝一份数组底下运行的时候会对原数组产生影响，影响第二份的输出结果
        int[] copy1=Arrays.copyOf(nums,nums.length);
        int[] copy2=Arrays.copyOf(nums,nums.length);
        System.out.println("写法一（哈市表）："+test.removeDuplicates1(copy1));
        System.out.println("写法二（快慢双指针）"+test.removeDuplicates2(copy2));
    }
}
